package part02_单例模式;

/**懒汉式（双重检查）
 * 线程安全，同步方法
 * @ClassName: SingletonTest02
 * @Author: AllenSun
 * @Date: 2019/12/4 21:41
 */
public class SingletonTest05 {
    public static void main(String[] args) {
        //优缺点跟之前一样，浪费内存
        Singleton05 instance01=Singleton05.getInstance();
        Singleton05 instance02=Singleton05.getInstance();
        System.out.println(instance01==instance02);
        System.out.println("instance01-hashCode="+instance01.hashCode());
        System.out.println("instance02-hashCode="+instance02.hashCode());
    }
}

/**优缺点：
 * 1-double-check：是多线程开发中常使用的，进行了两次if检查，就可以保证线程安全了
 * 2-示例代码只有执行一次，后面再次访问时，判断if，直接return实例化对象，也避免反复进行方法同步
 * 线程安全：延迟加载，效率较高
 * 所以说：在实际开发中，推荐使用这种单例设计模式
 *
 * @MethodName:
 * @Author: AllenSun
 * @Date: 2019/12/4 21:58
 */
class Singleton05{
    //1-构造器私有化
    private Singleton05(){ }
    //2-本类内部创建对象实例
    private static volatile Singleton05 instance;
    //3-提供一个公有的静态方法，当使用到这个方法时，才去创建instance
    // 加入同步synchronized处理的代码，解决线程安全问题（同步就是每次只能有一个线程获取）
    // 加入双重检查代码，解决线程安全问题，同时解决懒加载问题，同时保证了效率
    // 推荐使用
    // 懒汉式
    public static synchronized Singleton05 getInstance(){
        if(instance==null){
            synchronized (Singleton05.class){
                if(instance==null){
                    instance=new Singleton05();
                }
            }
        }
        return instance;
    }
}